package com.test.environment;

import com.test.source.MutablePropertySources;
import java.util.Map;

/**
 * ConfigurableEnvironment接口扩展了Environment接口，提供了配置环境属性的能力
 * 它允许在运行时修改活动配置文件、系统属性和环境变量等
 */
public interface ConfigurableEnvironment extends Environment {

    /**
     * 设置当前环境下的活动配置文件
     * 这些配置文件将用于配置环境特定的属性
     *
     * @param profiles 一个或多个活动配置文件名称
     */
    void setActiveProfiles(String... profiles);

    /**
     * 向当前环境中添加一个活动配置文件
     * 如果已有活动配置文件，新添加的配置文件将与现有的一起生效
     *
     * @param profile 要添加的活动配置文件名称
     */
    void addActiveProfile(String profile);

    /**
     * 设置当前环境下的默认配置文件
     * 默认配置文件将在没有明确指定活动配置文件时生效
     *
     * @param profiles 一个或多个默认配置文件名称
     */
    void setDefaultProfiles(String... profiles);

    /**
     * 获取当前系统属性的映射
     * 这些属性包括了Java虚拟机启动时的系统属性
     *
     * @return 包含系统属性的映射，键为属性名，值为属性值
     */
    Map<String, Object> getSystemProperties();

    /**
     * 获取当前系统的环境变量映射
     * 这些环境变量由系统提供给Java虚拟机
     *
     * @return 包含系统环境变量的映射，键为环境变量名，值为环境变量值
     */
    Map<String, Object> getSystemEnvironment();

    /**
     * 与另一个配置环境进行合并
     * 这个方法允许从父环境继承配置属性，同时保持当前环境的特定配置
     *
     * @param parent 父配置环境，其属性将与当前环境的属性合并
     */
    void merge(ConfigurableEnvironment parent);

    /**
     * 获取当前环境的可变属性源
     * 属性源是环境属性的来源，可以是系统属性、环境变量或其他自定义属性源
     *
     * @return 当前环境的可变属性源，可以通过它来添加、修改或删除环境属性
     */
    MutablePropertySources getPropertySources();

}
